using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public ProdutoatributoVO getProdutoatributo(int? idProdutoAtributo, string atributo)
		{
			ProdutoatributoVO produtoatributoVO = null;
			List<ProdutoatributoVO> listProdutoatributoVOs = getProdutoatributos(idProdutoAtributo, atributo, null);
			if (listProdutoatributoVOs != null && listProdutoatributoVOs.Count > 0)
			{
				produtoatributoVO = listProdutoatributoVOs[0];
			}
			return produtoatributoVO;
		}

		public ProdutoatributoVO getProdutoatributo(int? idProdutoAtributo)
		{
			return getProdutoatributo(idProdutoAtributo, null);
		}

		public List<ProdutoatributoVO> getProdutoatributos()
		{
			return getProdutoatributos(null, null, null);
		}

		public List<ProdutoatributoVO> getProdutoatributos(int? idProdutoAtributo)
		{
			return getProdutoatributos(idProdutoAtributo, null, null);
		}

		public List<ProdutoatributoVO> getProdutoatributos(int? idProdutoAtributo, string atributo)
		{
			return getProdutoatributos(idProdutoAtributo, atributo, null);
		}

		public List<ProdutoatributoVO> getProdutoatributos(int? idProdutoAtributo, string atributo, int? idProduto)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT pra.idProdutoAtributo as pra_idProdutoAtributo, pra.idProduto as pra_idProduto, prd.produto as prd_produto, pra.atributo as pra_atributo, pra.valor as pra_valor, pra.cadastro as pra_cadastro, pra.cadastradoPor as pra_cadastradoPor, pra.edicao as pra_edicao, pra.editadoPor as pra_editadoPor  ");
			query.AppendLine("FROM produtoatributo as pra LEFT OUTER JOIN produto as prd on pra.idProduto=prd.idProduto  ");
			if (idProdutoAtributo != null)
			{
				query.AppendLine(where + "pra.idProdutoAtributo=@idProdutoAtributo ");
				where = "AND ";
			}
			if (idProduto != null)
			{
				query.AppendLine(where + "pra.idProduto=@idProduto ");
				where = "AND ";
			}
			if (atributo != null)
			{
				query.AppendLine(where + "pra.atributo LIKE @atributo ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY pra.atributo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idProdutoAtributo!= null) cmd.Parameters.Add(getParameter(cmd, "@idProdutoAtributo", idProdutoAtributo));
			if (idProduto!= null) cmd.Parameters.Add(getParameter(cmd, "@idProduto", idProduto));
			if (atributo!= null) cmd.Parameters.Add(getParameter(cmd, "@atributo", "%"+atributo+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<ProdutoatributoVO> listProdutoatributo = new List<ProdutoatributoVO>();

				while (reader.Read())
				{
					ProdutoatributoVO produtoatributoVO = ProdutoatributoVO.CreateVO();
					produtoatributoVO.idProdutoAtributo = reader.GetInt32(reader.GetOrdinal("pra_idProdutoAtributo"));
					produtoatributoVO.idProduto = reader.GetInt32(reader.GetOrdinal("pra_idProduto"));
					if (!reader.IsDBNull(reader.GetOrdinal("prd_produto")))
						produtoatributoVO.idProdutoVO.produto = reader.GetString(reader.GetOrdinal("prd_produto"));
					produtoatributoVO.atributo = reader.GetString(reader.GetOrdinal("pra_atributo"));
					if (!reader.IsDBNull(reader.GetOrdinal("pra_valor")))
						produtoatributoVO.valor = reader.GetString(reader.GetOrdinal("pra_valor"));
					produtoatributoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("pra_cadastro"));
					produtoatributoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("pra_cadastradoPor"));
					produtoatributoVO.edicao = reader.GetDateTime(reader.GetOrdinal("pra_edicao"));
					produtoatributoVO.editadoPor = reader.GetString(reader.GetOrdinal("pra_editadoPor"));


					listProdutoatributo.Add(produtoatributoVO);
				}
				reader.Close();
				return listProdutoatributo;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setProdutoatributo(ProdutoatributoVO produtoatributoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE produtoatributo ");
			query.AppendLine("SET idProduto=@idProduto, atributo=@atributo, valor=@valor,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idProdutoAtributo=@idProdutoAtributo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idProdutoAtributo", produtoatributoVO.idProdutoAtributo));
			cmd.Parameters.Add(getParameter(cmd, "@idProduto", produtoatributoVO.idProduto));
			cmd.Parameters.Add(getParameter(cmd, "@atributo", produtoatributoVO.atributo));
			if (produtoatributoVO.valor == null)
				cmd.Parameters.Add(getParameter(cmd, "@valor", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@valor", produtoatributoVO.valor));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", produtoatributoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", produtoatributoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", produtoatributoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", produtoatributoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newProdutoatributo(ProdutoatributoVO produtoatributoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO produtoatributo ");
			query.AppendLine("  ( idProduto, atributo, valor, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @idProduto, @atributo, @valor, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idProduto", produtoatributoVO.idProduto));
			cmd.Parameters.Add(getParameter(cmd, "@atributo", produtoatributoVO.atributo));
			if (produtoatributoVO.valor == null)
				cmd.Parameters.Add(getParameter(cmd, "@valor", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@valor", produtoatributoVO.valor));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", produtoatributoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", produtoatributoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", produtoatributoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", produtoatributoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('produtoatributo') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delProdutoatributo(ProdutoatributoVO produtoatributoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM produtoatributo ");
			query.AppendLine("WHERE idProdutoAtributo=@idProdutoAtributo ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idProdutoAtributo", produtoatributoVO.idProdutoAtributo));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountProdutoatributoxIdProduto(int? idProduto)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idProduto) as ocorrencias FROM produtoatributo WHERE IdProduto=@IdProduto ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdProduto", idProduto));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
